// 导入 express
const express = require('express');
// 创建服务器的实例对象
const app = express()

const joi = require('joi')


// 导入并配置 cors 中间件
const cors = require('cors')

app.use(cors())


//配置解析表单数据的中间件,只能解析application/x-www-form-urlencoded 格式的表单数据的中间件
app.use(express.urlencoded({ extended:false }))


// 一定要在路由之前，封装res.cc() 函数
app.use((req, res, next) => {
    // status 默认值为1， 表示失败的情况
    res.cc = function (err, status = 1) {
    // err的值可能是一个错误的对象，也可能是一个错误的描述字符串
    res.send( {
        status,
        message: err instanceof Error ? err.message :err
    })
}
next()
})

//一定在路由之前配置解析 Token的中间件
const expressJWT = require('express-jwt') 
const config = require('./config')

// 托管静态资源文件
app.use('/uploads', express.static('./uploads'))

app.use(expressJWT({ secret: config.jwtSecretKey }).unless({ path: [/^\/api\//] }))


// 导入并使用用户路由模块
const userRouter = require('./router/user')
app.use('/api',userRouter)

// 导入并使用用户信息路由模块
const userinfoRouter = require('./router/userinfo')
// 注意：以 /my 开头的接口，都是有权限的接口，需要进行 Token 身份认证
app.use('/my', userinfoRouter)

// 导入并使用评论由模块
const commentsRouter = require('./router/comments')
// 为文章分类的路由挂载统一的访问前缀 /my/comments
app.use('/my/comments', commentsRouter)

app.use('/api/comments', commentsRouter)

// 导入并使用文章路由模块(主要用于登录)
const articleRouter = require('./router/article')
// 为文章的路由挂载统一的访问前缀 /my/article
app.use('/my/article', articleRouter)
// 导入并使用文章的路由模块(主要用于非登录状态)
app.use('/api/article', articleRouter)


// 导入并使用点赞的路由模块
const zanRouter = require('./router/zan')
// 为点赞的路由挂载统一的访问前缀 :/api/zan
app.use('/my/zan', zanRouter)


// 导入留言的路由模块
const chatRouter = require('./router/chat')
// 为留言的路由挂载统一的访问前缀 /my/chat
app.use('/my/chat', chatRouter)


// 导入活动的路由模块
const activityRouter = require('./router/activity')
// 为活动的路由挂载统一的访问前缀 /api/activity
app.use('/api/activity', activityRouter)

app.use('/my/activity', activityRouter)



// 定义错误级别中间件
app.use((err, req, res, next) =>{
    // 验证失败导致的错误
    if(err instanceof joi.ValidationError) return res.cc(err)
    // 身份认证失败后的错误
    if(err.name === 'UnauthorizedError') return res.cc('身份认证失败！')
    // 未知的错误
    res.cc(err)
})




// 启动服务器
app.listen(3007, ()=>{
    console.log('api server running at http://127.0.0.1:3007')
})